package com.sakura.oj.service;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.sakura.oj.model.dto.problem.ProblemSubmitRequest;
import com.sakura.oj.model.dto.submit.SubmitQueryRequest;
import com.sakura.oj.model.entity.ProblemSubmit;
import com.sakura.oj.model.vo.*;

import java.time.LocalDate;
import java.util.List;

/**
 * @author Sakura
 * @description 针对表【problem_submit(题目提交表)】的数据库操作Service
 * @createDate 2025-03-19 20:27:42
 */
public interface ProblemSubmitService extends IService<ProblemSubmit> {

    /**
     * 提交题目
     *
     * @param form 提交表单
     * @return 记录的id
     */
    Long doProblemSubmit(Long userId, ProblemSubmitRequest form);

    /**
     * 分页查询提交记录
     *
     * @param submitQueryRequest 查询条件
     * @return 分页结果
     */
    Page<SubmitVo> searchSubmitPageVo(Page<ProblemSubmit> page, SubmitQueryRequest submitQueryRequest);

    /**
     * 封装查询条件
     *
     * @param problemSubmitQueryRequest 查询条件
     * @return
     */
    Wrapper<ProblemSubmit> getQueryWrapper(SubmitQueryRequest problemSubmitQueryRequest);

    /**
     * 封装分页结果
     *
     * @param problemPage 分页结果
     * @return 分页结果
     */
    Page<ProblemSubmitVo> getProblemSubmitVOPage(Page<ProblemSubmit> problemPage);

    /**
     * 判断提交是否通过
     *
     * @param problemId 题目id
     * @param userId    用户id
     * @return 是否通过
     */
    boolean checkPass(Long problemId, Long userId);

    /**
     * 获取提交统计
     *
     * @param userId    用户id
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @return 提交统计
     */
    List<DailySubmissionStat> getSubmissionStats(Long userId, LocalDate startDate, LocalDate endDate);

    List<UserRankVo> getScoreRank(Long pageSize);

    /**
     * 获取热门题目id列表
     *
     * @param periodDays 最多天数
     * @param limit      限制
     * @return 热门题目id列表
     */
    List<Long> getHotProblemIds(Long periodDays, Long limit);

    /**
     * 获取用户编程语言提交数量
     *
     * @param userId 用户id
     * @return 用户编程语言提交数量
     */
    List<UserLanguageSubmitVo> getLanguageSubmitCounts(Long userId);

    /**
     * 获取最近提交的题目列表
     *
     * @param userId 用户id
     * @return 列表
     */
    List<RecentPassVo> getRecentlySubmittedList(Long userId);
}
